Progressionではまったところ
- 2008 年 12月 4 日
Progressionを使っていて気づいたところが出てきたので記録。
Progrssionのドキュメントクラスを使ったSWFを子ファイルとしてloadして、unloadした時、内部で管理しているstageの参照が削除されるようなのですが、これのせいで前回のRESIZEまわりの拡張が動かなくなるっぽい。
Progressionが提供するドキュメントクラスは、CastDocumentもCastPreloaderもExDocumentを継承しているのだけれど、このExDocumentを見てみたらステージ上の表示リストに追加された時(Event.ADDED_TO_STAGEの時)、_addedToStageが実行されて_stageってstaticな変数にstageの参照を格納しています。
以下のところ。
private function _addedToStage( e:Event ):void { // stage の参照を保存する _stage = stage; // 初期化する stageWidth = _stageWidth; stageHeight = _stageHeight; align = _align; displayState = _displayState; quality = _quality; scaleMode = _scaleMode; // stage への設置を完了する _addedToStaged = true; _initialize(); } |
で、内部的にはこの_stageに対して処理をしていると思うのですが、(stageもgetterになってて、この_stageを参照している)、表示リストから削除した時、以下の_removedFromStageが実行されて、_stageが空になります。
private function _removedFromStage( e:Event ):void { // stage の参照を削除する _stage = null; } |
これがまずいようで、ExDocumentを継承したドキュメントクラスを持つ、SWFを何ファイルか使って、そのSWFを読み込み、表示リストから削除したり、unloadしたりすると、_stageの参照が空なる。この_stageを他のSWFも参照しているので、_stageが空になった時、動かなくなるものが出てくるみたいです。
ExDocumentをドキュメントクラスに持つ複数のSWFをloadして、そのうち一つをunloadした時、動かなくなって気づきました。
前回のRESIZE関連のリスナーがエラーになるみたい。
_initializeと_resizeProgressで設定している、
_stage.addEventListener( Event.RESIZE, _resizeStart, false, int.MAX_VALUE, true ); |
がエラーになりました。
対策としては、
private function _removedFromStage( e:Event ):void { // stage の参照を削除する _stage.removeEventListener( Event.RESIZE, _resizeStart ); //_stage = null; } |
と、_stageの空を削除したところ(一応_stageのリスナーも明示的に削除しています。)一応これで問題は解決した。これでいい……のかな??
Progression始めたばかりで同じ現象につまずきました。
メチャクチャ助かりました!ありがとうございます。
これバグなんですかね??
kampeiさん。コメントありがとうございます。
CastDocumentまわりの拡張がされないのですが、読み込まれる側のドキュメントクラスをCastMovieClipかCastSpriteにしてもこの現象を回避できると思います。バグかどうか…。うーん、意図あっての設計かもしれないです。慣れるまではいろいろつまづきますよね。
なるほどー。
とりあえずドキュメントクラスはCastSpriteで事足りそうなので、こちらでやってみます。
Progression、慣れてしまえば随分便利になりそうなので、引き続きがんばってみます。
ありがとうございました!
コメントをどうぞ